{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取数据，数据都已经做过特征工程与标准化\n",
    "X_train = pd.read_csv('X_train.csv')\n",
    "y_train = pd.read_csv('y_train.csv')\n",
    "X_test = pd.read_csv('X_test.csv')\n",
    "y_test = pd.read_csv('y_test.csv')\n",
    "#X_train.info()\n",
    "#y_train.info()\n",
    "y_train = y_train.values\n",
    "c, r = y_train.shape\n",
    "y_train = y_train.reshape(c,)\n",
    "y_test = y_test.values\n",
    "c1, r1 = y_test.shape\n",
    "y_test = y_test.reshape(c1,)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.77      0.88      0.82        93\n",
      "          1       0.71      0.52      0.60        52\n",
      "\n",
      "avg / total       0.75      0.75      0.74       145\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[82 11]\n",
      " [25 27]]\n"
     ]
    }
   ],
   "source": [
    "#在测试集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_test)\n",
    "from sklearn import metrics\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\" % (SVC1, metrics.classification_report(y_test, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_test, y_predict))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#help(metrics)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.772020725388601\n",
      "{'C': 0.01}\n"
     ]
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "param_grid = {'C': Cs}\n",
    "grid = GridSearchCV(SVC(kernel='linear'), param_grid, cv=5)\n",
    "\n",
    "grid.fit(X_train, y_train)\n",
    "print(grid.best_score_)\n",
    "print(grid.best_params_)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_test, y_test):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_test, y_test)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.724137931034\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.744827586207\n",
      "accuracy: 0.737931034483\n",
      "accuracy: 0.675862068966\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.724137931034\n",
      "accuracy: 0.724137931034\n",
      "accuracy: 0.675862068966\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.731034482759\n",
      "accuracy: 0.696551724138\n",
      "accuracy: 0.675862068966\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_test, y_test)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.648275862069\n",
      "accuracy: 0.744827586207\n",
      "accuracy: 0.641379310345\n",
      "accuracy: 0.648275862069\n",
      "accuracy: 0.744827586207\n",
      "accuracy: 0.724137931034\n",
      "accuracy: 0.648275862069\n",
      "accuracy: 0.758620689655\n",
      "accuracy: 0.744827586207\n",
      "accuracy: 0.731034482759\n"
     ]
    }
   ],
   "source": [
    "#在调整一次参数\n",
    "C_s = np.logspace(-1, 2, 4)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-5, -2, 4)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_test, y_test)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a1da53310>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
